Enter the directory of the maca folder on your drive and the name of the tissue you want to analyze.

tissue_of_interest = "Tongue"
library(here)
here() starts at /Users/olgabot/code/tabula-muris
source(here("00_data_ingest", "02_tissue_analysis_rmd", "boilerplate.R"))
package ‘dplyr’ was built under R version 3.4.2
Attaching package: ‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union
tiss = load_tissue_droplet(tissue_of_interest)
Performing log-normalization
0%   10   20   30   40   50   60   70   80   90   100%
|----|----|----|----|----|----|----|----|----|----|
**************************************************|
[1] "Scaling data matrix"

  |                                                                                                                                 
  |                                                                                                                           |   0%
  |                                                                                                                                 
  |=====                                                                                                                      |   4%
  |                                                                                                                                 
  |==========                                                                                                                 |   8%
  |                                                                                                                                 
  |===============                                                                                                            |  12%
  |                                                                                                                                 
  |====================                                                                                                       |  17%
  |                                                                                                                                 
  |==========================                                                                                                 |  21%
  |                                                                                                                                 
  |===============================                                                                                            |  25%
  |                                                                                                                                 
  |====================================                                                                                       |  29%
  |                                                                                                                                 
  |=========================================                                                                                  |  33%
  |                                                                                                                                 
  |==============================================                                                                             |  38%
  |                                                                                                                                 
  |===================================================                                                                        |  42%
  |                                                                                                                                 
  |========================================================                                                                   |  46%
  |                                                                                                                                 
  |==============================================================                                                             |  50%
  |                                                                                                                                 
  |===================================================================                                                        |  54%
  |                                                                                                                                 
  |========================================================================                                                   |  58%
  |                                                                                                                                 
  |=============================================================================                                              |  62%
  |                                                                                                                                 
  |==================================================================================                                         |  67%
  |                                                                                                                                 
  |=======================================================================================                                    |  71%
  |                                                                                                                                 
  |============================================================================================                               |  75%
  |                                                                                                                                 
  |=================================================================================================                          |  79%
  |                                                                                                                                 
  |======================================================================================================                     |  83%
  |                                                                                                                                 
  |============================================================================================================               |  88%
  |                                                                                                                                 
  |=================================================================================================================          |  92%
  |                                                                                                                                 
  |======================================================================================================================     |  96%
  |                                                                                                                                 
  |===========================================================================================================================| 100%
Calculating gene means
0%   10   20   30   40   50   60   70   80   90   100%
|----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variance to mean ratios
0%   10   20   30   40   50   60   70   80   90   100%
|----|----|----|----|----|----|----|----|----|----|
**************************************************|

Later on (in FindClusters and TSNE) you will pick a number of principal components to use. This has the effect of keeping the major directions of variation in the data and, ideally, supressing noise. There is no correct answer to the number to use, but a decent rule of thumb is to go until the plot plateaus.

PCElbowPlot(object = tiss)

Choose the number of principal components to use.

# Set number of principal components. 
n.pcs = 14

The clustering is performed based on a nearest neighbors graph. Cells that have similar expression will be joined together. The Louvain algorithm looks for groups of cells with high modularity–more connections within the group than between groups. The resolution parameter determines the scale…higher resolution will give more clusters, lower resolution will give fewer.

For the top-level clustering, aim to under-cluster instead of over-cluster. It will be easy to subset groups and further analyze them below.

# Set resolution 
res.used <- 0.4
tiss <- FindClusters(object = tiss, reduction.type = "pca", dims.use = 1:n.pcs, 
    resolution = res.used, print.output = 0, save.SNN = TRUE, force.recalc = TRUE)

To visualize

# If cells are too spread out, you can raise the perplexity. If you have few cells, try a lower perplexity (but never less than 10).
tiss <- RunTSNE(object = tiss, dims.use = 1:n.pcs, seed.use = 20, perplexity=35, dim.embed = 2)
TSNEPlot(object = tiss, do.label = T, pt.size = 1.2, label.size = 4)

Check expression of genes of interset.

Dotplots let you see the intensity of exppression and the fraction of cells expressing for each of your genes of interest.

How big are the clusters?

table(tiss@ident)

   0    1    2    3    4    5    6    7    8    9   10 
1389 1095 1079  869  815  602  601  485  366  199   38 
tiss1=BuildClusterTree(tiss)
[1] "Finished averaging RNA for cluster 0"
[1] "Finished averaging RNA for cluster 1"
[1] "Finished averaging RNA for cluster 2"
[1] "Finished averaging RNA for cluster 3"
[1] "Finished averaging RNA for cluster 4"
[1] "Finished averaging RNA for cluster 5"
[1] "Finished averaging RNA for cluster 6"
[1] "Finished averaging RNA for cluster 7"
[1] "Finished averaging RNA for cluster 8"
[1] "Finished averaging RNA for cluster 9"
[1] "Finished averaging RNA for cluster 10"

#cluster1.markers <- FindMarkers(object = tiss, ident.1 = 1, min.pct = 0.25, only.pos = TRUE, thresh.use = 0.25)
#cluster2.markers <- FindMarkers(object = tiss, ident.1 = 2, min.pct = 0.25, only.pos = TRUE, thresh.use = 0.25)
#cluster3.markers <- FindMarkers(object = tiss, ident.1 = 3, min.pct = 0.25, only.pos = TRUE, thresh.use = 0.25)
#cluster4.markers <- FindMarkers(object = tiss, ident.1 = 4, min.pct = 0.25, only.pos = TRUE, thresh.use = 0.25)
#cluster5.markers <- FindMarkers(object = tiss, ident.1 = 5, min.pct = 0.25, only.pos = TRUE, thresh.use = 0.25)
cluster6.markers <- FindMarkers(object = tiss, ident.1 = 6, min.pct = 0.25, only.pos = TRUE, thresh.use = 0.25)

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~01m 26s      
   |++                                                | 2 % ~02m 11s      
   |++                                                | 3 % ~01m 55s      
   |+++                                               | 4 % ~01m 48s      
   |+++                                               | 5 % ~01m 43s      
   |++++                                              | 7 % ~01m 38s      
   |++++                                              | 8 % ~01m 33s      
   |+++++                                             | 9 % ~01m 29s      
   |+++++                                             | 10% ~01m 25s      
   |++++++                                            | 11% ~01m 23s      
   |++++++                                            | 12% ~01m 20s      
   |+++++++                                           | 13% ~01m 19s      
   |++++++++                                          | 14% ~01m 17s      
   |++++++++                                          | 15% ~01m 15s      
   |+++++++++                                         | 16% ~01m 13s      
   |+++++++++                                         | 17% ~01m 11s      
   |++++++++++                                        | 18% ~01m 10s      
   |++++++++++                                        | 20% ~01m 08s      
   |+++++++++++                                       | 21% ~01m 07s      
   |+++++++++++                                       | 22% ~01m 06s      
   |++++++++++++                                      | 23% ~01m 04s      
   |++++++++++++                                      | 24% ~01m 03s      
   |+++++++++++++                                     | 25% ~01m 02s      
   |++++++++++++++                                    | 26% ~01m 01s      
   |++++++++++++++                                    | 27% ~60s          
   |+++++++++++++++                                   | 28% ~59s          
   |+++++++++++++++                                   | 29% ~57s          
   |++++++++++++++++                                  | 30% ~56s          
   |++++++++++++++++                                  | 32% ~55s          
   |+++++++++++++++++                                 | 33% ~54s          
   |+++++++++++++++++                                 | 34% ~53s          
   |++++++++++++++++++                                | 35% ~52s          
   |++++++++++++++++++                                | 36% ~51s          
   |+++++++++++++++++++                               | 37% ~50s          
   |++++++++++++++++++++                              | 38% ~49s          
   |++++++++++++++++++++                              | 39% ~48s          
   |+++++++++++++++++++++                             | 40% ~47s          
   |+++++++++++++++++++++                             | 41% ~46s          
   |++++++++++++++++++++++                            | 42% ~45s          
   |++++++++++++++++++++++                            | 43% ~44s          
   |+++++++++++++++++++++++                           | 45% ~44s          
   |+++++++++++++++++++++++                           | 46% ~43s          
   |++++++++++++++++++++++++                          | 47% ~42s          
   |++++++++++++++++++++++++                          | 48% ~41s          
   |+++++++++++++++++++++++++                         | 49% ~40s          
   |+++++++++++++++++++++++++                         | 50% ~39s          
   |++++++++++++++++++++++++++                        | 51% ~38s          
   |+++++++++++++++++++++++++++                       | 52% ~37s          
   |+++++++++++++++++++++++++++                       | 53% ~36s          
   |++++++++++++++++++++++++++++                      | 54% ~35s          
   |++++++++++++++++++++++++++++                      | 55% ~34s          
   |+++++++++++++++++++++++++++++                     | 57% ~34s          
   |+++++++++++++++++++++++++++++                     | 58% ~33s          
   |++++++++++++++++++++++++++++++                    | 59% ~32s          
   |++++++++++++++++++++++++++++++                    | 60% ~31s          
   |+++++++++++++++++++++++++++++++                   | 61% ~30s          
   |+++++++++++++++++++++++++++++++                   | 62% ~29s          
   |++++++++++++++++++++++++++++++++                  | 63% ~28s          
   |+++++++++++++++++++++++++++++++++                 | 64% ~28s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~27s          
   |++++++++++++++++++++++++++++++++++                | 66% ~26s          
   |++++++++++++++++++++++++++++++++++                | 67% ~25s          
   |+++++++++++++++++++++++++++++++++++               | 68% ~24s          
   |+++++++++++++++++++++++++++++++++++               | 70% ~23s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~22s          
   |++++++++++++++++++++++++++++++++++++              | 72% ~22s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~21s          
   |+++++++++++++++++++++++++++++++++++++             | 74% ~20s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~19s          
   |+++++++++++++++++++++++++++++++++++++++           | 76% ~18s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~17s          
   |++++++++++++++++++++++++++++++++++++++++          | 78% ~17s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~16s          
   |+++++++++++++++++++++++++++++++++++++++++         | 80% ~15s          
   |+++++++++++++++++++++++++++++++++++++++++         | 82% ~14s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~13s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~12s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~12s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~11s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~10s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~09s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~08s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~07s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~07s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~06s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~05s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~04s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~03s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 01m 15s
#cluster7.markers <- FindMarkers(object = tiss, ident.1 = 7, min.pct = 0.25, only.pos = TRUE, thresh.use = 0.25)
#cluster8.markers <- FindMarkers(object = tiss, ident.1 = 8, min.pct = 0.25, only.pos = TRUE, thresh.use = 0.25)
#cluster9.markers <- FindMarkers(object = tiss, ident.1 = 9, min.pct = 0.25, only.pos = TRUE, thresh.use = 0.25)
#cluster0.markers <- FindMarkers(object = tiss, ident.1 = 0, min.pct = 0.25, only.pos = TRUE, thresh.use = 0.25)

Which markers identify a specific cluster?

print(x = head(x = cluster6.markers, n = 30))

You can also compute all markers for all clusters at once. This may take some time.

tiss.markers <- FindAllMarkers(object = tiss, only.pos = TRUE, min.pct = 0.25, thresh.use = 0.25)

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~40s          
   |++                                                | 2 % ~38s          
   |++                                                | 3 % ~37s          
   |+++                                               | 5 % ~37s          
   |+++                                               | 6 % ~36s          
   |++++                                              | 7 % ~37s          
   |++++                                              | 8 % ~36s          
   |+++++                                             | 9 % ~35s          
   |++++++                                            | 10% ~34s          
   |++++++                                            | 11% ~34s          
   |+++++++                                           | 12% ~33s          
   |+++++++                                           | 14% ~33s          
   |++++++++                                          | 15% ~32s          
   |++++++++                                          | 16% ~31s          
   |+++++++++                                         | 17% ~31s          
   |++++++++++                                        | 18% ~30s          
   |++++++++++                                        | 19% ~30s          
   |+++++++++++                                       | 20% ~29s          
   |+++++++++++                                       | 22% ~29s          
   |++++++++++++                                      | 23% ~28s          
   |++++++++++++                                      | 24% ~28s          
   |+++++++++++++                                     | 25% ~27s          
   |++++++++++++++                                    | 26% ~27s          
   |++++++++++++++                                    | 27% ~26s          
   |+++++++++++++++                                   | 28% ~26s          
   |+++++++++++++++                                   | 30% ~26s          
   |++++++++++++++++                                  | 31% ~25s          
   |++++++++++++++++                                  | 32% ~25s          
   |+++++++++++++++++                                 | 33% ~24s          
   |++++++++++++++++++                                | 34% ~24s          
   |++++++++++++++++++                                | 35% ~23s          
   |+++++++++++++++++++                               | 36% ~23s          
   |+++++++++++++++++++                               | 38% ~22s          
   |++++++++++++++++++++                              | 39% ~22s          
   |++++++++++++++++++++                              | 40% ~22s          
   |+++++++++++++++++++++                             | 41% ~21s          
   |++++++++++++++++++++++                            | 42% ~21s          
   |++++++++++++++++++++++                            | 43% ~20s          
   |+++++++++++++++++++++++                           | 44% ~20s          
   |+++++++++++++++++++++++                           | 45% ~20s          
   |++++++++++++++++++++++++                          | 47% ~19s          
   |++++++++++++++++++++++++                          | 48% ~19s          
   |+++++++++++++++++++++++++                         | 49% ~18s          
   |+++++++++++++++++++++++++                         | 50% ~18s          
   |++++++++++++++++++++++++++                        | 51% ~18s          
   |+++++++++++++++++++++++++++                       | 52% ~17s          
   |+++++++++++++++++++++++++++                       | 53% ~17s          
   |++++++++++++++++++++++++++++                      | 55% ~16s          
   |++++++++++++++++++++++++++++                      | 56% ~16s          
   |+++++++++++++++++++++++++++++                     | 57% ~16s          
   |+++++++++++++++++++++++++++++                     | 58% ~15s          
   |++++++++++++++++++++++++++++++                    | 59% ~15s          
   |+++++++++++++++++++++++++++++++                   | 60% ~14s          
   |+++++++++++++++++++++++++++++++                   | 61% ~14s          
   |++++++++++++++++++++++++++++++++                  | 62% ~14s          
   |++++++++++++++++++++++++++++++++                  | 64% ~13s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~13s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~12s          
   |++++++++++++++++++++++++++++++++++                | 67% ~12s          
   |+++++++++++++++++++++++++++++++++++               | 68% ~11s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~11s          
   |++++++++++++++++++++++++++++++++++++              | 70% ~11s          
   |++++++++++++++++++++++++++++++++++++              | 72% ~10s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~10s          
   |+++++++++++++++++++++++++++++++++++++             | 74% ~09s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~09s          
   |+++++++++++++++++++++++++++++++++++++++           | 76% ~09s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~08s          
   |++++++++++++++++++++++++++++++++++++++++          | 78% ~08s          
   |++++++++++++++++++++++++++++++++++++++++          | 80% ~07s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~07s          
   |+++++++++++++++++++++++++++++++++++++++++         | 82% ~07s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~06s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~06s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~05s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~05s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~05s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~04s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~04s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~03s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~03s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 36s

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~19s          
   |++                                                | 2 % ~19s          
   |++                                                | 3 % ~18s          
   |+++                                               | 5 % ~18s          
   |+++                                               | 6 % ~18s          
   |++++                                              | 7 % ~17s          
   |++++                                              | 8 % ~17s          
   |+++++                                             | 9 % ~17s          
   |++++++                                            | 10% ~16s          
   |++++++                                            | 11% ~16s          
   |+++++++                                           | 12% ~16s          
   |+++++++                                           | 14% ~15s          
   |++++++++                                          | 15% ~15s          
   |++++++++                                          | 16% ~15s          
   |+++++++++                                         | 17% ~15s          
   |++++++++++                                        | 18% ~15s          
   |++++++++++                                        | 19% ~14s          
   |+++++++++++                                       | 20% ~14s          
   |+++++++++++                                       | 22% ~14s          
   |++++++++++++                                      | 23% ~14s          
   |++++++++++++                                      | 24% ~14s          
   |+++++++++++++                                     | 25% ~13s          
   |++++++++++++++                                    | 26% ~13s          
   |++++++++++++++                                    | 27% ~13s          
   |+++++++++++++++                                   | 28% ~13s          
   |+++++++++++++++                                   | 30% ~13s          
   |++++++++++++++++                                  | 31% ~12s          
   |++++++++++++++++                                  | 32% ~12s          
   |+++++++++++++++++                                 | 33% ~12s          
   |++++++++++++++++++                                | 34% ~12s          
   |++++++++++++++++++                                | 35% ~12s          
   |+++++++++++++++++++                               | 36% ~12s          
   |+++++++++++++++++++                               | 38% ~11s          
   |++++++++++++++++++++                              | 39% ~11s          
   |++++++++++++++++++++                              | 40% ~11s          
   |+++++++++++++++++++++                             | 41% ~11s          
   |++++++++++++++++++++++                            | 42% ~11s          
   |++++++++++++++++++++++                            | 43% ~10s          
   |+++++++++++++++++++++++                           | 44% ~10s          
   |+++++++++++++++++++++++                           | 45% ~10s          
   |++++++++++++++++++++++++                          | 47% ~10s          
   |++++++++++++++++++++++++                          | 48% ~10s          
   |+++++++++++++++++++++++++                         | 49% ~09s          
   |+++++++++++++++++++++++++                         | 50% ~09s          
   |++++++++++++++++++++++++++                        | 51% ~09s          
   |+++++++++++++++++++++++++++                       | 52% ~09s          
   |+++++++++++++++++++++++++++                       | 53% ~09s          
   |++++++++++++++++++++++++++++                      | 55% ~09s          
   |++++++++++++++++++++++++++++                      | 56% ~08s          
   |+++++++++++++++++++++++++++++                     | 57% ~08s          
   |+++++++++++++++++++++++++++++                     | 58% ~08s          
   |++++++++++++++++++++++++++++++                    | 59% ~08s          
   |+++++++++++++++++++++++++++++++                   | 60% ~07s          
   |+++++++++++++++++++++++++++++++                   | 61% ~07s          
   |++++++++++++++++++++++++++++++++                  | 62% ~07s          
   |++++++++++++++++++++++++++++++++                  | 64% ~07s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~07s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~06s          
   |++++++++++++++++++++++++++++++++++                | 67% ~06s          
   |+++++++++++++++++++++++++++++++++++               | 68% ~06s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~06s          
   |++++++++++++++++++++++++++++++++++++              | 70% ~05s          
   |++++++++++++++++++++++++++++++++++++              | 72% ~05s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~05s          
   |+++++++++++++++++++++++++++++++++++++             | 74% ~05s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~05s          
   |+++++++++++++++++++++++++++++++++++++++           | 76% ~04s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~04s          
   |++++++++++++++++++++++++++++++++++++++++          | 78% ~04s          
   |++++++++++++++++++++++++++++++++++++++++          | 80% ~04s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~04s          
   |+++++++++++++++++++++++++++++++++++++++++         | 82% ~03s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~03s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~03s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~03s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 18s

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~54s          
   |++                                                | 2 % ~53s          
   |++                                                | 3 % ~52s          
   |+++                                               | 5 % ~51s          
   |+++                                               | 6 % ~49s          
   |++++                                              | 7 % ~49s          
   |+++++                                             | 8 % ~51s          
   |+++++                                             | 9 % ~50s          
   |++++++                                            | 10% ~49s          
   |++++++                                            | 11% ~48s          
   |+++++++                                           | 13% ~47s          
   |+++++++                                           | 14% ~47s          

Display the top markers you computed above.

tiss.markers %>% group_by(cluster) %>% top_n(20, avg_logFC)
Error in filter_impl(.data, quo) : 
  Evaluation error: object 'avg_logFC' not found.

Generate an expression heatmap for given cells and genes. In this case, we are plotting the top 20 markers (or all markers if less than 20) for each cluster.

Assigning cell type identity to clusters

At a coarse level, we can use canonical markers to match the unbiased clustering to known cell types: Cluster 0: basal cell of epidermis (CL:0002187) Cluster 1: differentiated keratinocytes (CL:0000312) Cluster 2: proliferating basal cell of epidermis (CL:0002187) Clutser 3: basal cell of epidermis (CL:0002187) Cluster 4: suprabasal differentiating keratinocytes (CL:0000312) Cluster 5: basal cell of epidermis (CL:0002187) Cluster 6: suprabasal differentiated keratinocytes (CL:0000312) Cluster 7: basal cell of epidermis (CL:0002187) Clutser 8: suprabasal differentiated keratinocytes (CL:0000312) Cluster 9: filiform differentiated keratinocytes (CL:0000312) Cluster 10: Langerhans cells (CL:0000453)

Checking for batch effects

Color by metadata, like plate barcode, to check for batch effects.

Print a table showing the count of cells in each identity category from each plate.

Save the Robject for later

When you save the annotated tissue, please give it a name.

Export the final metadata

So that Biohub can easily combine all your cell_ontology_classs, please export them as a simple csv.

LS0tCiB0aXRsZTogIlRvbmd1ZSBEcm9wbGV0IE5vdGVib29rIgogb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKRW50ZXIgdGhlIGRpcmVjdG9yeSBvZiB0aGUgbWFjYSBmb2xkZXIgb24geW91ciBkcml2ZSBhbmQgdGhlIG5hbWUgb2YgdGhlIHRpc3N1ZSB5b3Ugd2FudCB0byBhbmFseXplLgoKYGBge3J9CnRpc3N1ZV9vZl9pbnRlcmVzdCA9ICJUb25ndWUiCmxpYnJhcnkoaGVyZSkKc291cmNlKGhlcmUoIjAwX2RhdGFfaW5nZXN0IiwgIjAyX3Rpc3N1ZV9hbmFseXNpc19ybWQiLCAiYm9pbGVycGxhdGUuUiIpKQp0aXNzID0gbG9hZF90aXNzdWVfZHJvcGxldCh0aXNzdWVfb2ZfaW50ZXJlc3QpCmBgYAoKCmBgYHtyLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTE2LCBmaWcud2lkdGg9OH0KI1BDSGVhdG1hcChvYmplY3QgPSB0aXNzLCBwYy51c2UgPSAxOjMsIGNlbGxzLnVzZSA9IDUwMCwgZG8uYmFsYW5jZWQgPSBUUlVFLCBsYWJlbC5jb2x1bW5zID0gRkFMU0UsIG51bS5nZW5lcyA9IDgpClBDSGVhdG1hcChvYmplY3QgPSB0aXNzLCBwYy51c2UgPSAxOjEwLCBjZWxscy51c2UgPSA1MDAsIGRvLmJhbGFuY2VkID0gVFJVRSwgCiAgICBsYWJlbC5jb2x1bW5zID0gRkFMU0UsIHVzZS5mdWxsID0gRkFMU0UpCmBgYAoKTGF0ZXIgb24gKGluIEZpbmRDbHVzdGVycyBhbmQgVFNORSkgeW91IHdpbGwgcGljayBhIG51bWJlciBvZiBwcmluY2lwYWwgY29tcG9uZW50cyB0byB1c2UuIFRoaXMgaGFzIHRoZSBlZmZlY3Qgb2Yga2VlcGluZyB0aGUgbWFqb3IgZGlyZWN0aW9ucyBvZiB2YXJpYXRpb24gaW4gdGhlIGRhdGEgYW5kLCBpZGVhbGx5LCBzdXByZXNzaW5nIG5vaXNlLiBUaGVyZSBpcyBubyBjb3JyZWN0IGFuc3dlciB0byB0aGUgbnVtYmVyIHRvIHVzZSwgYnV0IGEgZGVjZW50IHJ1bGUgb2YgdGh1bWIgaXMgdG8gZ28gdW50aWwgdGhlIHBsb3QgcGxhdGVhdXMuCgpgYGB7cn0KUENFbGJvd1Bsb3Qob2JqZWN0ID0gdGlzcykKYGBgCgpDaG9vc2UgdGhlIG51bWJlciBvZiBwcmluY2lwYWwgY29tcG9uZW50cyB0byB1c2UuCmBgYHtyfQojIFNldCBudW1iZXIgb2YgcHJpbmNpcGFsIGNvbXBvbmVudHMuIApuLnBjcyA9IDE0CmBgYAoKClRoZSBjbHVzdGVyaW5nIGlzIHBlcmZvcm1lZCBiYXNlZCBvbiBhIG5lYXJlc3QgbmVpZ2hib3JzIGdyYXBoLiBDZWxscyB0aGF0IGhhdmUgc2ltaWxhciBleHByZXNzaW9uIHdpbGwgYmUgam9pbmVkIHRvZ2V0aGVyLiBUaGUgTG91dmFpbiBhbGdvcml0aG0gbG9va3MgZm9yIGdyb3VwcyBvZiBjZWxscyB3aXRoIGhpZ2ggbW9kdWxhcml0eS0tbW9yZSBjb25uZWN0aW9ucyB3aXRoaW4gdGhlIGdyb3VwIHRoYW4gYmV0d2VlbiBncm91cHMuIFRoZSByZXNvbHV0aW9uIHBhcmFtZXRlciBkZXRlcm1pbmVzIHRoZSBzY2FsZS4uLmhpZ2hlciByZXNvbHV0aW9uIHdpbGwgZ2l2ZSBtb3JlIGNsdXN0ZXJzLCBsb3dlciByZXNvbHV0aW9uIHdpbGwgZ2l2ZSBmZXdlci4KCkZvciB0aGUgdG9wLWxldmVsIGNsdXN0ZXJpbmcsIGFpbSB0byB1bmRlci1jbHVzdGVyIGluc3RlYWQgb2Ygb3Zlci1jbHVzdGVyLiBJdCB3aWxsIGJlIGVhc3kgdG8gc3Vic2V0IGdyb3VwcyBhbmQgZnVydGhlciBhbmFseXplIHRoZW0gYmVsb3cuCgpgYGB7cn0KIyBTZXQgcmVzb2x1dGlvbiAKcmVzLnVzZWQgPC0gMC40Cgp0aXNzIDwtIEZpbmRDbHVzdGVycyhvYmplY3QgPSB0aXNzLCByZWR1Y3Rpb24udHlwZSA9ICJwY2EiLCBkaW1zLnVzZSA9IDE6bi5wY3MsIAogICAgcmVzb2x1dGlvbiA9IHJlcy51c2VkLCBwcmludC5vdXRwdXQgPSAwLCBzYXZlLlNOTiA9IFRSVUUsIGZvcmNlLnJlY2FsYyA9IFRSVUUpCmBgYAoKClRvIHZpc3VhbGl6ZSAKYGBge3J9CiMgSWYgY2VsbHMgYXJlIHRvbyBzcHJlYWQgb3V0LCB5b3UgY2FuIHJhaXNlIHRoZSBwZXJwbGV4aXR5LiBJZiB5b3UgaGF2ZSBmZXcgY2VsbHMsIHRyeSBhIGxvd2VyIHBlcnBsZXhpdHkgKGJ1dCBuZXZlciBsZXNzIHRoYW4gMTApLgp0aXNzIDwtIFJ1blRTTkUob2JqZWN0ID0gdGlzcywgZGltcy51c2UgPSAxOm4ucGNzLCBzZWVkLnVzZSA9IDIwLCBwZXJwbGV4aXR5PTM1LCBkaW0uZW1iZWQgPSAyKQpUU05FUGxvdChvYmplY3QgPSB0aXNzLCBkby5sYWJlbCA9IFQsIHB0LnNpemUgPSAxLjIsIGxhYmVsLnNpemUgPSA0KQpgYGAKCgpDaGVjayBleHByZXNzaW9uIG9mIGdlbmVzIG9mIGludGVyc2V0LgoKYGBge3IsIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9MTYsIGZpZy53aWR0aD0xMH0KZ2VuZXNfdG9fY2hlY2sgPSBjKCdJdGdiNCcsICdJdGdhNicsICdJdGdiMScsICdDZGgzJywgJ1RvcDJhJywgJ010MicsICdLcnQxNScsICdLcnQ1JywgJ0tydDE0JywgJ1Nic24nLCAnS3J0MTAnLCdLbGY0JwosICdLcnQ4NCcsICdLcnQzNicsICdIb3hjMTMnLCAnS3J0NCcsICdLcnQxMycsICdGYWJwNScsICdLcnQzMicsICAnS3J0NzgnLCAnVmltJywgJ0hoaXAnLCAnUHRjaDEnLCAnR2xpMScsJ0RzYzEnLCAnRGNuJywgJ1J1bngyJywgJ1NveDInLCAnUGF4OScpCkZlYXR1cmVQbG90KHRpc3MsIGdlbmVzX3RvX2NoZWNrLCBwdC5zaXplID0gMSwgbkNvbCA9IDQpCmBgYAoKRG90cGxvdHMgbGV0IHlvdSBzZWUgdGhlIGludGVuc2l0eSBvZiBleHBwcmVzc2lvbiBhbmQgdGhlIGZyYWN0aW9uIG9mIGNlbGxzIGV4cHJlc3NpbmcgZm9yIGVhY2ggb2YgeW91ciBnZW5lcyBvZiBpbnRlcmVzdC4KCmBgYHtyLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD0yMH0KIyBUbyBjaGFuZ2UgdGhlIHktYXhpcyB0byBzaG93IHJhdyBjb3VudHMsIGFkZCB1c2UucmF3ID0gVC4KRG90UGxvdCh0aXNzLCBnZW5lc190b19jaGVjaywgcGxvdC5sZWdlbmQgPSBUKQpgYGAKCgpgYGB7ciwgZWNobz1GQUxTRSwgZmlnLmhlaWdodD0yMCwgZmlnLndpZHRoPTIwfQojIFRvIGNoYW5nZSB0aGUgeS1heGlzIHRvIHNob3cgcmF3IGNvdW50cywgYWRkIHVzZS5yYXcgPSBULgpWbG5QbG90KHRpc3MsIGdlbmVzX3RvX2NoZWNrLCB5LmxvZyA9IFRSVUUpCmBgYAoKCkhvdyBiaWcgYXJlIHRoZSBjbHVzdGVycz8KYGBge3J9CnRhYmxlKHRpc3NAaWRlbnQpCmBgYAoKYGBge3J9CnRpc3MxPUJ1aWxkQ2x1c3RlclRyZWUodGlzcykKYGBgCgpgYGB7cn0KI2NsdXN0ZXIxLm1hcmtlcnMgPC0gRmluZE1hcmtlcnMob2JqZWN0ID0gdGlzcywgaWRlbnQuMSA9IDEsIG1pbi5wY3QgPSAwLjI1LCBvbmx5LnBvcyA9IFRSVUUsIHRocmVzaC51c2UgPSAwLjI1KQojY2x1c3RlcjIubWFya2VycyA8LSBGaW5kTWFya2VycyhvYmplY3QgPSB0aXNzLCBpZGVudC4xID0gMiwgbWluLnBjdCA9IDAuMjUsIG9ubHkucG9zID0gVFJVRSwgdGhyZXNoLnVzZSA9IDAuMjUpCiNjbHVzdGVyMy5tYXJrZXJzIDwtIEZpbmRNYXJrZXJzKG9iamVjdCA9IHRpc3MsIGlkZW50LjEgPSAzLCBtaW4ucGN0ID0gMC4yNSwgb25seS5wb3MgPSBUUlVFLCB0aHJlc2gudXNlID0gMC4yNSkKI2NsdXN0ZXI0Lm1hcmtlcnMgPC0gRmluZE1hcmtlcnMob2JqZWN0ID0gdGlzcywgaWRlbnQuMSA9IDQsIG1pbi5wY3QgPSAwLjI1LCBvbmx5LnBvcyA9IFRSVUUsIHRocmVzaC51c2UgPSAwLjI1KQojY2x1c3RlcjUubWFya2VycyA8LSBGaW5kTWFya2VycyhvYmplY3QgPSB0aXNzLCBpZGVudC4xID0gNSwgbWluLnBjdCA9IDAuMjUsIG9ubHkucG9zID0gVFJVRSwgdGhyZXNoLnVzZSA9IDAuMjUpCmNsdXN0ZXI2Lm1hcmtlcnMgPC0gRmluZE1hcmtlcnMob2JqZWN0ID0gdGlzcywgaWRlbnQuMSA9IDYsIG1pbi5wY3QgPSAwLjI1LCBvbmx5LnBvcyA9IFRSVUUsIHRocmVzaC51c2UgPSAwLjI1KQojY2x1c3RlcjcubWFya2VycyA8LSBGaW5kTWFya2VycyhvYmplY3QgPSB0aXNzLCBpZGVudC4xID0gNywgbWluLnBjdCA9IDAuMjUsIG9ubHkucG9zID0gVFJVRSwgdGhyZXNoLnVzZSA9IDAuMjUpCiNjbHVzdGVyOC5tYXJrZXJzIDwtIEZpbmRNYXJrZXJzKG9iamVjdCA9IHRpc3MsIGlkZW50LjEgPSA4LCBtaW4ucGN0ID0gMC4yNSwgb25seS5wb3MgPSBUUlVFLCB0aHJlc2gudXNlID0gMC4yNSkKI2NsdXN0ZXI5Lm1hcmtlcnMgPC0gRmluZE1hcmtlcnMob2JqZWN0ID0gdGlzcywgaWRlbnQuMSA9IDksIG1pbi5wY3QgPSAwLjI1LCBvbmx5LnBvcyA9IFRSVUUsIHRocmVzaC51c2UgPSAwLjI1KQojY2x1c3RlcjAubWFya2VycyA8LSBGaW5kTWFya2VycyhvYmplY3QgPSB0aXNzLCBpZGVudC4xID0gMCwgbWluLnBjdCA9IDAuMjUsIG9ubHkucG9zID0gVFJVRSwgdGhyZXNoLnVzZSA9IDAuMjUpCmBgYAoKV2hpY2ggbWFya2VycyBpZGVudGlmeSBhIHNwZWNpZmljIGNsdXN0ZXI/CmBgYHtyfQpwcmludCh4ID0gaGVhZCh4ID0gY2x1c3RlcjYubWFya2VycywgbiA9IDMwKSkKYGBgCgoKWW91IGNhbiBhbHNvIGNvbXB1dGUgYWxsIG1hcmtlcnMgZm9yIGFsbCBjbHVzdGVycyBhdCBvbmNlLiBUaGlzIG1heSB0YWtlIHNvbWUgdGltZS4KYGBge3J9CnRpc3MubWFya2VycyA8LSBGaW5kQWxsTWFya2VycyhvYmplY3QgPSB0aXNzLCBvbmx5LnBvcyA9IFRSVUUsIG1pbi5wY3QgPSAwLjI1LCB0aHJlc2gudXNlID0gMC4yNSkKYGBgCgpEaXNwbGF5IHRoZSB0b3AgbWFya2VycyB5b3UgY29tcHV0ZWQgYWJvdmUuCmBgYHtyfQp0aXNzLm1hcmtlcnMgJT4lIGdyb3VwX2J5KGNsdXN0ZXIpICU+JSB0b3BfbigyMCwgYXZnX2xvZ0ZDKQpgYGAKCgpHZW5lcmF0ZSBhbiBleHByZXNzaW9uIGhlYXRtYXAgZm9yIGdpdmVuIGNlbGxzIGFuZCBnZW5lcy4gSW4gdGhpcyBjYXNlLCB3ZSBhcmUgcGxvdHRpbmcgdGhlIHRvcCAyMCBtYXJrZXJzIChvciBhbGwgbWFya2VycyBpZiBsZXNzIHRoYW4gMjApIGZvciBlYWNoIGNsdXN0ZXIuCmBgYHtyLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTUwLCBmaWcud2lkdGg9MzV9CiN0b3AxMCA8LSB0aXNzLm1hcmtlcnMgJT4lIGdyb3VwX2J5KGNsdXN0ZXIpICU+JSB0b3BfbigxMCwgYXZnX2xvZ0ZDKQp0b3AyMCA8LSB0aXNzLm1hcmtlcnMgJT4lIGdyb3VwX2J5KGNsdXN0ZXIpICU+JSB0b3BfbigyMCwgYXZnX2xvZ0ZDKQojIHNldHRpbmcgc2xpbS5jb2wubGFiZWwgdG8gVFJVRSB3aWxsIHByaW50IGp1c3QgdGhlIGNsdXN0ZXIgSURTIGluc3RlYWQgb2YKIyBldmVyeSBjZWxsIG5hbWUKRG9IZWF0bWFwKHRpc3MsIGdlbmVzLnVzZSA9IHRvcDIwJGdlbmUsIHNsaW0uY29sLmxhYmVsID0gVFJVRSwgcmVtb3ZlLmtleSA9IFRSVUUsIGNleC5yb3cgPSAyMCwgZ3JvdXAuY2V4ID0gMjAgKQpgYGAKCgoKIyMgQXNzaWduaW5nIGNlbGwgdHlwZSBpZGVudGl0eSB0byBjbHVzdGVycwoKQXQgYSBjb2Fyc2UgbGV2ZWwsIHdlIGNhbiB1c2UgY2Fub25pY2FsIG1hcmtlcnMgdG8gbWF0Y2ggdGhlIHVuYmlhc2VkIGNsdXN0ZXJpbmcgdG8ga25vd24gY2VsbCB0eXBlczoKQ2x1c3RlciAwOiBiYXNhbCBjZWxsIG9mIGVwaWRlcm1pcyAoQ0w6MDAwMjE4NykKQ2x1c3RlciAxOiBkaWZmZXJlbnRpYXRlZCBrZXJhdGlub2N5dGVzIChDTDowMDAwMzEyKQpDbHVzdGVyIDI6IHByb2xpZmVyYXRpbmcgYmFzYWwgY2VsbCBvZiBlcGlkZXJtaXMgKENMOjAwMDIxODcpCkNsdXRzZXIgMzogYmFzYWwgY2VsbCBvZiBlcGlkZXJtaXMgKENMOjAwMDIxODcpIApDbHVzdGVyIDQ6IHN1cHJhYmFzYWwgZGlmZmVyZW50aWF0aW5nIGtlcmF0aW5vY3l0ZXMgIChDTDowMDAwMzEyKQpDbHVzdGVyIDU6IGJhc2FsIGNlbGwgb2YgZXBpZGVybWlzIChDTDowMDAyMTg3KSAKQ2x1c3RlciA2OiBzdXByYWJhc2FsIGRpZmZlcmVudGlhdGVkIGtlcmF0aW5vY3l0ZXMgKENMOjAwMDAzMTIpCkNsdXN0ZXIgNzogYmFzYWwgY2VsbCBvZiBlcGlkZXJtaXMgKENMOjAwMDIxODcpCkNsdXRzZXIgODogc3VwcmFiYXNhbCBkaWZmZXJlbnRpYXRlZCBrZXJhdGlub2N5dGVzIChDTDowMDAwMzEyKQpDbHVzdGVyIDk6IGZpbGlmb3JtIGRpZmZlcmVudGlhdGVkIGtlcmF0aW5vY3l0ZXMgKENMOjAwMDAzMTIpCkNsdXN0ZXIgMTA6IExhbmdlcmhhbnMgY2VsbHMgKENMOjAwMDA0NTMpCmBgYHtyfQojIHN0YXNoIGN1cnJlbnQgY2x1c3RlciBJRHMKdGlzcyA8LSBTdGFzaElkZW50KG9iamVjdCA9IHRpc3MsIHNhdmUubmFtZSA9ICJjbHVzdGVyLmlkcyIpCgojIGVudW1lcmF0ZSBjdXJyZW50IGNsdXN0ZXIgSURzIGFuZCB0aGUgbGFiZWxzIGZvciB0aGVtCmNsdXN0ZXIuaWRzIDwtIGMoMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTApCgpmcmVlX2Fubm90YXRpb24gPC0gYygKICJiYXNhbF9jZWxscyIsIAogImRpZmZlcmVudGlhdGVkIiwgCiAicHJvbGlmZXJhdGluZyIsIAogImJhc2FsX2NlbGxzIiwgCiAic3VwcmFiYXNhbF9kaWZmZXJlbnRpYXRpbmciLCAKICJiYXNhbF9jZWxscyIsIAogInN1cHJhYmFzYWxfZGlmZmVyZW50aWF0ZWQiLCAKICJiYXNhbF9jZWxscyIsIAogInN1cHJhYmFzYWxfZGlmZmVyZW50aWF0ZWQiLCAKICJmaWxpZm9ybV9kaWZmZXJlbnRpYXRlZCIsIAogIkxhbmdlcmhhbnMgY2VsbHMiCiApCmNlbGxfb250b2xvZ3lfY2xhc3MgPC0gYygKImJhc2FsIGNlbGwgb2YgZXBpZGVybWlzIiwgCiJrZXJhdGlub2N5dGUiLCAKImJhc2FsIGNlbGwgb2YgZXBpZGVybWlzIiwKImJhc2FsIGNlbGwgb2YgZXBpZGVybWlzIiwKImtlcmF0aW5vY3l0ZSIsCiJiYXNhbCBjZWxsIG9mIGVwaWRlcm1pcyIsCiJrZXJhdGlub2N5dGUiLAoiYmFzYWwgY2VsbCBvZiBlcGlkZXJtaXMiLAoia2VyYXRpbm9jeXRlIiwKImtlcmF0aW5vY3l0ZSIsCiAiTGFuZ2VyaGFucyBjZWxscyIKICkKCnZhbGlkYXRlX2NlbGxfb250b2xvZ3koY2VsbF9vbnRvbG9neV9jbGFzcykKY2VsbF9vbnRvbG9neV9pZCA9IGNvbnZlcnRfdG9fY2VsbF9vbnRvbG9neV9pZChjZWxsX29udG9sb2d5X2NsYXNzKQoKdGlzc0BtZXRhLmRhdGFbLCdmcmVlX2Fubm90YXRpb24nXSA8LSBwbHlyOjptYXB2YWx1ZXMoeCA9IHRpc3NAaWRlbnQsIGZyb20gPSBjbHVzdGVyLmlkcywgdG8gPSBmcmVlX2Fubm90YXRpb24pCnRpc3NAbWV0YS5kYXRhWywnY2VsbF9vbnRvbG9neV9jbGFzcyddIDwtIHBseXI6Om1hcHZhbHVlcyh4ID0gdGlzc0BpZGVudCwgZnJvbSA9IGNsdXN0ZXIuaWRzLCB0byA9IGNlbGxfb250b2xvZ3lfY2xhc3MpCnRpc3NAbWV0YS5kYXRhWywnY2VsbF9vbnRvbG9neV9pZCddIDwtIHBseXI6Om1hcHZhbHVlcyh4ID0gdGlzc0BpZGVudCwgZnJvbSA9IGNsdXN0ZXIuaWRzLCB0byA9IGNlbGxfb250b2xvZ3lfaWQpCgp0aXNzQG1ldGEuZGF0YVt0aXNzQGNlbGwubmFtZXMsJ2ZyZWVfYW5ub3RhdGlvbiddIDwtIGFzLmNoYXJhY3Rlcih0aXNzQG1ldGEuZGF0YSRmcmVlX2Fubm90YXRpb24pCnRpc3NAbWV0YS5kYXRhW3Rpc3NAY2VsbC5uYW1lcywnY2VsbF9vbnRvbG9neV9jbGFzcyddIDwtIGFzLmNoYXJhY3Rlcih0aXNzQG1ldGEuZGF0YSRjZWxsX29udG9sb2d5X2NsYXNzKQp0aXNzQG1ldGEuZGF0YVt0aXNzQGNlbGwubmFtZXMsJ2NlbGxfb250b2xvZ3lfaWQnXSA8LSBhcy5jaGFyYWN0ZXIodGlzc0BtZXRhLmRhdGEkY2VsbF9vbnRvbG9neV9pZCkKClRTTkVQbG90KG9iamVjdCA9IHRpc3MsIGRvLmxhYmVsID0gVFJVRSwgcHQuc2l6ZSA9IDAuNSwgZ3JvdXAuYnk9J2NlbGxfb250b2xvZ3lfY2xhc3MnKQpgYGAKCgojIyBDaGVja2luZyBmb3IgYmF0Y2ggZWZmZWN0cwoKCkNvbG9yIGJ5IG1ldGFkYXRhLCBsaWtlIHBsYXRlIGJhcmNvZGUsIHRvIGNoZWNrIGZvciBiYXRjaCBlZmZlY3RzLgpgYGB7cn0KVFNORVBsb3Qob2JqZWN0ID0gdGlzcywgZG8ucmV0dXJuID0gVFJVRSwgZ3JvdXAuYnkgPSAiY2hhbm5lbCIpCmBgYAoKYGBge3J9ClRTTkVQbG90KG9iamVjdCA9IHRpc3MsIGRvLnJldHVybiA9IFRSVUUsIGdyb3VwLmJ5ID0gIm1vdXNlLnNleCIpCmBgYAoKUHJpbnQgYSB0YWJsZSBzaG93aW5nIHRoZSBjb3VudCBvZiBjZWxscyBpbiBlYWNoIGlkZW50aXR5IGNhdGVnb3J5IGZyb20gZWFjaCBwbGF0ZS4KCmBgYHtyfQp0YWJsZShhcy5jaGFyYWN0ZXIodGlzc0BpZGVudCksIGFzLmNoYXJhY3Rlcih0aXNzQG1ldGEuZGF0YSRjaGFubmVsKSkKYGBgCgojIFNhdmUgdGhlIFJvYmplY3QgZm9yIGxhdGVyCldoZW4geW91IHNhdmUgdGhlIGFubm90YXRlZCB0aXNzdWUsIHBsZWFzZSBnaXZlIGl0IGEgbmFtZS4KCmBgYHtyfQpmaWxlbmFtZSA9IGhlcmUoJzAwX2RhdGFfaW5nZXN0JywgJzA0X3Rpc3N1ZV9yb2JqX2dlbmVyYXRlZCcsIAoJCSAgcGFzdGUwKCJkcm9wbGV0IiwgdGlzc3VlX29mX2ludGVyZXN0LCAiX3NldXJhdF90aXNzLlJvYmoiKSkKcHJpbnQoZmlsZW5hbWUpCnNhdmUodGlzcywgZmlsZT1maWxlbmFtZSkKYGBgCgpgYGB7cn0KIyBUbyByZWxvYWQgYSBzYXZlZCBvYmplY3QKZmlsZW5hbWUgPSBoZXJlKCcwMF9kYXRhX2luZ2VzdCcsICcwNF90aXNzdWVfcm9ial9nZW5lcmF0ZWQnLCAKICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgiZHJvcGxldCIsIHRpc3N1ZV9vZl9pbnRlcmVzdCwgIl9zZXVyYXRfdGlzcy5Sb2JqIikpCiBsb2FkKGZpbGU9ZmlsZW5hbWUpCmBgYAoKCiMgRXhwb3J0IHRoZSBmaW5hbCBtZXRhZGF0YQoKU28gdGhhdCBCaW9odWIgY2FuIGVhc2lseSBjb21iaW5lIGFsbCB5b3VyIGNlbGxfb250b2xvZ3lfY2xhc3NzLCBwbGVhc2UgZXhwb3J0IHRoZW0gYXMgYSBzaW1wbGUgY3N2LgoKYGBge3J9CmhlYWQodGlzc0BtZXRhLmRhdGEpCmBgYAoKCmBgYHtyfQpmaWxlbmFtZSA9IGhlcmUoJzAwX2RhdGFfaW5nZXN0JywgJzAzX3Rpc3N1ZV9hbm5vdGF0aW9uX2NzdicsIAoJCSAgcGFzdGUwKHRpc3N1ZV9vZl9pbnRlcmVzdCwgIl9kcm9wbGV0X2Fubm90YXRpb24uY3N2IikpCndyaXRlLmNzdihGZXRjaERhdGEodGlzcywgYygnY2hhbm5lbCcsJ2NlbGxfb250b2xvZ3lfY2xhc3MnLCdjZWxsX29udG9sb2d5X2lkJywgJ2ZyZWVfYW5ub3RhdGlvbicsICd0U05FXzEnLCAndFNORV8yJykpLCBmaWxlPWZpbGVuYW1lKQpgYGAK